///////////////////////////////////////////////////////////////////////////////
//
// Copyright
//
///////////////////////////////////////////////////////////////////////////////

package ru.goodcore.utils {

import flash.utils.Endian;
import flash.utils.ByteArray;

/**
 * 
 * @author					
 * @version					1.0
 * @playerversion			Flash 9
 * @langversion				3.0
 * 
 * @keyword					number, utils
 */
public final class NumberUtils {

	//-------------------------------------------------------------------------
	//
	//  Class methods
	//
	//-------------------------------------------------------------------------

	/**
	 * Rotates x left n bits
	 * 
	 * @param	x					
	 * @param	n					
	 * 
	 * @return						
	 */
	public static function rol(x:int, n:int):int {
		return ( x << n ) | ( x >>> ( 32 - n ) );
	}

	/**
	 * Rotates x right n bits
	 * 
	 * @param	x					
	 * @param	n					
	 * 
	 * @return						
	 */
	public static function ror(x:int, n:int):uint {
		n = 32 - n;
		return ( x << n ) | ( x >>> ( 32 - n ) );
	}

	/**
	 * @private
	 * String for quick lookup of a hex character based on index
	 */
	private static const hexChars:String = "0123456789abcdef";

	/**
	 * Outputs the hex value of a int, allowing the developer to specify
	 * the endinaness in the process.  Hex output is lowercase.
	 *
	 * @param	n		The int value to output as hex
	 * @param	endian				
	 * 
	 * @return			A string of length 8 corresponding to the hex 
	 * 					representation of n ( minus the leading "0x" )
	 */
	public static function toHex(n:int, endian:String='littleEndian'):String {
		var s:String = '';

		switch (endian) {
			case Endian.BIG_ENDIAN:
				for ( var i:int = 0; i < 4; i++ ) {
					s +=	hexChars.charAt( ( n >> ( ( 3 - i ) * 8 + 4 ) ) & 0xF ) +
							hexChars.charAt( ( n >> ( ( 3 - i ) * 8     ) ) & 0xF );
				}
				break;

			case Endian.LITTLE_ENDIAN:
				for ( var x:int = 0; x < 4; x++ ) {
					s +=	hexChars.charAt( ( n >> ( x * 8 + 4 ) ) & 0xF ) +
							hexChars.charAt( ( n >> ( x * 8 ) ) & 0xF );
				}
				break;
		}

		return s;
	}

}
}